<?php

/**
 * JPGraph v4.0.3
 */

namespace lemon\JpGraph\Text;

use lemon\JpGraph\Util;

/**
 * @class TTF
 * // Description: Handle TTF font names and mapping and loading of
 * //			  font files
 */
class TTF
{
	private $font_files;
	private $style_names;
	public static $FONT_BASEPATH;

	public function __construct()
	{
		self::$FONT_BASEPATH = getenv('JPGRAPH_FONT_BASEPATH') ?
		getenv('JPGRAPH_FONT_BASEPATH') :
		dirname(__DIR__) . '/fonts/';
		// String names for font styles to be used in error messages
		$this->style_names = [
			FS_NORMAL	 => 'normal',
			FS_BOLD	   => 'bold',
			FS_ITALIC	 => 'italic',
			FS_BOLDITALIC => 'bolditalic',
		];

		// File names for available fonts
		$this->font_files = [
			FF_COURIER		  => [
				FS_NORMAL	 => 'cour.ttf',
				FS_BOLD	   => 'courbd.ttf',
				FS_ITALIC	 => 'couri.ttf',
				FS_BOLDITALIC => 'courbi.ttf',
			],
			FF_GEORGIA		  => [
				FS_NORMAL	 => 'georgia.ttf',
				FS_BOLD	   => 'georgiab.ttf',
				FS_ITALIC	 => 'georgiai.ttf',
				FS_BOLDITALIC => '',
			],
			FF_TREBUCHE		 => [
				FS_NORMAL	 => 'trebuc.ttf',
				FS_BOLD	   => 'trebucbd.ttf',
				FS_ITALIC	 => 'trebucit.ttf',
				FS_BOLDITALIC => 'trebucbi.ttf',
			],
			FF_VERDANA		  => [
				FS_NORMAL	 => 'verdana.ttf',
				FS_BOLD	   => 'verdanab.ttf',
				FS_ITALIC	 => 'verdanai.ttf',
				FS_BOLDITALIC => '',
			],
			FF_TIMES			=> [
				FS_NORMAL	 => 'times.ttf',
				FS_BOLD	   => 'timesbd.ttf',
				FS_ITALIC	 => 'timesi.ttf',
				FS_BOLDITALIC => 'timesbi.ttf',
			],
			FF_COMIC			=> [
				FS_NORMAL	 => 'comic.ttf',
				FS_BOLD	   => 'comicbd.ttf',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],
			/*FF_ARIAL => array(FS_NORMAL => 'arial.ttf',
			FS_BOLD => 'arialbd.ttf',
			FS_ITALIC => 'ariali.ttf',
			FS_BOLDITALIC => 'arialbi.ttf'),
			 */
			FF_ARIAL			=> [
				FS_NORMAL	 => 'arial.ttf',
				FS_BOLD	   => 'msttcorefonts/Arial_Black.ttf',
				FS_ITALIC	 => 'ariali.ttf',
				FS_BOLDITALIC => 'arialbi.ttf',
			],
			FF_VERA			 => [
				FS_NORMAL	 => 'Vera.ttf',
				FS_BOLD	   => 'VeraBd.ttf',
				FS_ITALIC	 => 'VeraIt.ttf',
				FS_BOLDITALIC => 'VeraBI.ttf',
			],
			FF_VERAMONO		 => [
				FS_NORMAL	 => 'VeraMono.ttf',
				FS_BOLD	   => 'VeraMoBd.ttf',
				FS_ITALIC	 => 'VeraMoIt.ttf',
				FS_BOLDITALIC => 'VeraMoBI.ttf',
			],
			FF_VERASERIF		=> [
				FS_NORMAL	 => 'VeraSe.ttf',
				FS_BOLD	   => 'VeraSeBd.ttf',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			/* Chinese fonts */
			FF_SIMSUN		   => [
				FS_NORMAL	 => 'simsun.ttc',
				FS_BOLD	   => 'simhei.ttf',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],
			FF_CHINESE		  => [
				FS_NORMAL	 => CHINESE_TTF_FONT,
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],
			FF_BIG5			 => [
				FS_NORMAL	 => CHINESE_TTF_FONT,
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			/* Japanese fonts */
			FF_MINCHO		   => [
				FS_NORMAL	 => MINCHO_TTF_FONT,
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			FF_PMINCHO		  => [
				FS_NORMAL	 => PMINCHO_TTF_FONT,
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			FF_GOTHIC		   => [
				FS_NORMAL	 => GOTHIC_TTF_FONT,
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			FF_PGOTHIC		  => [
				FS_NORMAL	 => PGOTHIC_TTF_FONT,
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			/* Hebrew fonts */
			FF_DAVID			=> [
				FS_NORMAL	 => 'DAVIDNEW.TTF',
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			FF_MIRIAM		   => [
				FS_NORMAL	 => 'MRIAMY.TTF',
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			FF_AHRON			=> [
				FS_NORMAL	 => 'ahronbd.ttf',
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			/* Misc fonts */
			FF_DIGITAL		  => [
				FS_NORMAL	 => 'DIGIRU__.TTF',
				FS_BOLD	   => 'Digirtu_.ttf',
				FS_ITALIC	 => 'Digir___.ttf',
				FS_BOLDITALIC => 'DIGIRT__.TTF',
			],

			/* This is an experimental font for the speedometer development
			FF_SPEEDO =>	array(
			FS_NORMAL =>'Speedo.ttf',
			FS_BOLD =>'',
			FS_ITALIC =>'',
			FS_BOLDITALIC =>''
			),
			 */

			FF_COMPUTER		 => [
				FS_NORMAL	 => 'COMPUTER.TTF',
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			FF_CALCULATOR	   => [
				FS_NORMAL	 => 'Triad_xs.ttf',
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			/* Dejavu fonts */
			FF_DV_SANSSERIF	 => [
				FS_NORMAL	 => ['DejaVuSans.ttf'],
				FS_BOLD	   => ['DejaVuSans-Bold.ttf', 'DejaVuSansBold.ttf'],
				FS_ITALIC	 => ['DejaVuSans-Oblique.ttf', 'DejaVuSansOblique.ttf'],
				FS_BOLDITALIC => ['DejaVuSans-BoldOblique.ttf', 'DejaVuSansBoldOblique.ttf'],
			],

			FF_DV_SANSSERIFMONO => [
				FS_NORMAL	 => ['DejaVuSansMono.ttf', 'DejaVuMonoSans.ttf'],
				FS_BOLD	   => ['DejaVuSansMono-Bold.ttf', 'DejaVuMonoSansBold.ttf'],
				FS_ITALIC	 => ['DejaVuSansMono-Oblique.ttf', 'DejaVuMonoSansOblique.ttf'],
				FS_BOLDITALIC => ['DejaVuSansMono-BoldOblique.ttf', 'DejaVuMonoSansBoldOblique.ttf'],
			],

			FF_DV_SANSSERIFCOND => [
				FS_NORMAL	 => ['DejaVuSansCondensed.ttf', 'DejaVuCondensedSans.ttf'],
				FS_BOLD	   => ['DejaVuSansCondensed-Bold.ttf', 'DejaVuCondensedSansBold.ttf'],
				FS_ITALIC	 => ['DejaVuSansCondensed-Oblique.ttf', 'DejaVuCondensedSansOblique.ttf'],
				FS_BOLDITALIC => ['DejaVuSansCondensed-BoldOblique.ttf', 'DejaVuCondensedSansBoldOblique.ttf'],
			],

			FF_DV_SERIF		 => [
				FS_NORMAL	 => ['DejaVuSerif.ttf'],
				FS_BOLD	   => ['DejaVuSerif-Bold.ttf', 'DejaVuSerifBold.ttf'],
				FS_ITALIC	 => ['DejaVuSerif-Italic.ttf', 'DejaVuSerifItalic.ttf'],
				FS_BOLDITALIC => ['DejaVuSerif-BoldItalic.ttf', 'DejaVuSerifBoldItalic.ttf'],
			],

			FF_DV_SERIFCOND	 => [
				FS_NORMAL	 => ['DejaVuSerifCondensed.ttf', 'DejaVuCondensedSerif.ttf'],
				FS_BOLD	   => ['DejaVuSerifCondensed-Bold.ttf', 'DejaVuCondensedSerifBold.ttf'],
				FS_ITALIC	 => ['DejaVuSerifCondensed-Italic.ttf', 'DejaVuCondensedSerifItalic.ttf'],
				FS_BOLDITALIC => ['DejaVuSerifCondensed-BoldItalic.ttf', 'DejaVuCondensedSerifBoldItalic.ttf'],
			],

			/* Placeholders for defined fonts */
			FF_USERFONT1		=> [
				FS_NORMAL	 => '',
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			FF_USERFONT2		=> [
				FS_NORMAL	 => '',
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],

			FF_USERFONT3		=> [
				FS_NORMAL	 => '',
				FS_BOLD	   => '',
				FS_ITALIC	 => '',
				FS_BOLDITALIC => '',
			],
		];
	}

	/**
	 * Encapsulates the logic to check for a file existance
	 * If it exists and it's readable, return full path. Otherwise return false.
	 *
	 * @param <type> $file	  The file
	 * @param bool   $folder	The folder
	 * @param mixed  $font_file
	 * @param mixed  $font_path
	 *
	 * @return bool the full path if exists
	 */
	private static function getFullPathIfExists($font_file, $font_path = '')
	{
		$full_path = sprintf('%s%s', $font_path, $font_file);

		if (file_exists($full_path) && is_readable($full_path)) {
			return $full_path;
		}
		// kdump('Not found: ' . $font_path);
		return false;
	}

	/**
	 * Given a font family and a style, returns the full path to the font
	 * Please check your DoxyDoxygen user configuration file.
	 *
	 * @param mixed  $family	font family (e.g. FF_COURIER, FF_VERDANA)
	 * @param mixed  $style	 optional font style, defaults to  FS_NORMAL
	 * @param string $font_path optional font_path. If set, it takes precedence over other paths
	 *
	 * @example ` $ttf->File(FF_DV_SANSSERIF, FS_BOLD); // would return <self::LIBRARY ROOT>/self::src/fonts/DejaVuSans-Bold-ttf
	 * ` */
	public function File($family, $style = FS_NORMAL, $font_path = null)
	{
		$fam = @$this->font_files[$family];
		if (!$fam) {
			Util\JpGraphError::RaiseL(25046, $family); //("Specified TTF font family (id=$family) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/");
		}
		$ff = @$fam[$style];

		// There are several optional file names. They are tried in order
		// and the first one found is used
		if (!is_array($ff)) {
			$ff = [$ff];
		}
		$jpgraph_font_dir = \Yii::getAlias("@backend").'/assets/fonts/';

		foreach ($ff as $font_file) {
			// All font families are guaranteed to have the normal style

			if ($font_file === '') {
				Util\JpGraphError::RaiseL(25047, $this->style_names[$style], $this->font_files[$family][FS_NORMAL]);
			}
			//('Style "'.$this->style_names[$style].'" is not available for font family '.$this->font_files[$family][FS_NORMAL].'.');
			if (!$font_file) {
				Util\JpGraphError::RaiseL(25048, $fam); //("Unknown font style specification [$fam].");
			}

			if ($font_candidate = self::getFullPathIfExists($font_file, $jpgraph_font_dir)) {
				$font_file = $font_candidate;
				break;
			}
			if ($font_candidate = self::getFullPathIfExists($font_file, $font_path)) {
				$font_file = $font_candidate;
				break;
			}
			if ($font_candidate = self::getFullPathIfExists($font_file, self::$FONT_BASEPATH)) {
				$font_file = $font_candidate;
				break;
			}

			// check OS font dir
			if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) {
				$font_file = MBTTF_DIR . $font_file;
			} else {
				$font_file = TTF_DIR . $font_file;
			}
			if (file_exists($font_file) === true && is_readable($font_file) === true) {
				break;
			}
		}

		if (!file_exists($font_file)) {
			//Util\JpGraphError::RaiseL(25049, $font_file); //("Font file \"$font_file\" is not readable or does not exist.");
			return $this->File(FF_DV_SANSSERIF, $style);
		}

		return $font_file;
	}

	public function SetUserFont($aNormal, $aBold = '', $aItalic = '', $aBoldIt = '')
	{
		$this->font_files[FF_USERFONT] =
			[FS_NORMAL	=> $aNormal,
			FS_BOLD	   => $aBold,
			FS_ITALIC	 => $aItalic,
			FS_BOLDITALIC => $aBoldIt,
		];
	}

	public function SetUserFont1($aNormal, $aBold = '', $aItalic = '', $aBoldIt = '')
	{
		$this->font_files[FF_USERFONT1] =
			[FS_NORMAL	=> $aNormal,
			FS_BOLD	   => $aBold,
			FS_ITALIC	 => $aItalic,
			FS_BOLDITALIC => $aBoldIt,
		];
	}

	public function SetUserFont2($aNormal, $aBold = '', $aItalic = '', $aBoldIt = '')
	{
		$this->font_files[FF_USERFONT2] =
			[FS_NORMAL	=> $aNormal,
			FS_BOLD	   => $aBold,
			FS_ITALIC	 => $aItalic,
			FS_BOLDITALIC => $aBoldIt,
		];
	}

	public function SetUserFont3($aNormal, $aBold = '', $aItalic = '', $aBoldIt = '')
	{
		$this->font_files[FF_USERFONT3] =
			[FS_NORMAL	=> $aNormal,
			FS_BOLD	   => $aBold,
			FS_ITALIC	 => $aItalic,
			FS_BOLDITALIC => $aBoldIt,
		];
	}
} // @class
